package br.com.divulgaqui.managedbean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.divulgaqui.client.ModeloServiceBeanLocal;
import br.com.divulgaqui.client.exception.EntityIgualException;
import br.com.divulgaqui.entity.Modelo;

import com.ocpsoft.pretty.faces.annotation.URLAction;
import com.ocpsoft.pretty.faces.annotation.URLMapping;
import com.ocpsoft.pretty.faces.annotation.URLMappings;

@ManagedBean
@ViewScoped
@URLMappings(mappings={
		  @URLMapping(id = "cadastroModelo", pattern = "/admin/modelo/cadastro", viewId = "/admin/modelo/cadastro.jsf"),
		  @URLMapping(id = "pesquisaModelo", pattern = "/admin/modelo/pesquisa", viewId = "/admin/modelo/pesquisaModelo.jsf")
		})
public class ModeloManagedBean extends BaseBean{		
	
	private static final long serialVersionUID = 1L;
	private Modelo modelo;
	private List<Modelo> modelos;
	private List<Modelo> modelosComplete;
	private Modelo modeloSelecionado;
	
	@EJB
	private ModeloServiceBeanLocal modeloServiceBeanLocal;
	
	public ModeloManagedBean(){
	}
	
	@PostConstruct
	public void init(){
		modelo = new Modelo();	
		setModeloSelecionado(new Modelo());
		setModelos(new ArrayList<Modelo>());		
	}
	
	/**
	 * Inclui um modelo
	 */
	public void salvar(){	
		try {
			modeloServiceBeanLocal.salvar(modelo);
			modelo = new Modelo();
			carregarModelos();
			addMensagem(FacesMessage.SEVERITY_INFO, "Modelo", "Cadastrado com sucesso.");
		} catch (EntityIgualException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Modelo", "Modelo com nome "+modelo.getNome()+" já foi cadastrado.");
		}
	}
	
	/**
	 * Atualiza um modelo
	 */
	public void atualizar(){		
		try {
			modeloServiceBeanLocal.atualizar(modeloSelecionado);
			modeloSelecionado = new Modelo();
			carregarModelos();
			addMensagem(FacesMessage.SEVERITY_INFO, "Modelo", "Atualizado com sucesso.");
		} catch (EntityIgualException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Modelo", "Modelo com nome "+modelo.getNome()+" já foi cadastrado.");
		}
	}
	
	/**
	 * Atualiza o modelo da pesquisa
	 */
	public void atualizarModeloPesquisa(){
		try {
			modeloServiceBeanLocal.atualizar(modeloSelecionado);			
			addMensagem(FacesMessage.SEVERITY_INFO, "Modelo", "Atualizado com sucesso.");
		} catch (EntityIgualException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Modelo", "Modelo com nome "+modelo.getNome()+" já foi cadastrado.");
		}
	}
	
	public void excluir(){
		//TODO Verificar como fazer
	}
	
	/**
	 * Carrega um modelo e suas especificacoes
	 */
	public void carrgarModeloEspecificacoes(){		
		if(modeloSelecionado == null){
			return;
		}			
		modeloSelecionado = modeloServiceBeanLocal.recuperarModeloEEspecificacoes(modeloSelecionado.getId());
	}
	
	/**
	 * Lista os modelos
	 */
	@URLAction(mappingId="cadastroModelo",onPostback=false)
	public void carregarModelos(){		
		modelos = modeloServiceBeanLocal.listarModelosComMarcaECategoria();
	}
	
	/**
	 * Pesquisa os modelos que conferem com o texto informado
	 * e retorna a lista
	 * @param texto
	 * @return result
	 */
	public List<Modelo> complete(String texto){
		if(modelosComplete == null){
			modelosComplete = modeloServiceBeanLocal.listarModelos();
		}
		List<Modelo> result = new ArrayList<Modelo>();		
		for (Modelo modelo : modelosComplete) {
			if ((modelo.getNome() != null && modelo.getNome().toLowerCase()
					.indexOf(texto.toLowerCase()) == 0)
					|| "".equals(texto)) {
				result.add(modelo);
			}
		}
		return result;
	}	
	
	//====================== Get e Set ====================//

	public Modelo getModelo() {
		return modelo;
	}

	public void setModelo(Modelo modelo) {
		this.modelo = modelo;
	}

	public List<Modelo> getModelos() {
		return modelos;
	}

	public void setModelos(List<Modelo> modelos) {
		this.modelos = modelos;
	}

	public Modelo getModeloSelecionado() {
		return modeloSelecionado;
	}

	public void setModeloSelecionado(Modelo modeloSelecionado) {
		this.modeloSelecionado = modeloSelecionado;
	}
}
